//ghazi  khodjet el khil
#include <stdlib.h>

typedef struct element element;
struct element
{
    int val;
    int t[2];
    struct element *nxt;
};

typedef element* llist;

llist ajouterEnTete(llist liste, int valeur)
{
    /* On crée un nouvel élément */
    element* nouvelElement = malloc(sizeof(element));

    /* On assigne la valeur au nouvel élément */
    printf("donner");
    scanf("%d",&nouvelElement->val);

printf("donner1");
    scanf("%d",nouvelElement->t+1);


    printf("%d",*(nouvelElement->t+1));
    /* On assigne l'adresse de l'élément suivant au nouvel élément */
    nouvelElement->nxt = liste;
    liste=nouvelElement;

    /* On retourne la nouvelle liste, i.e. le pointeur sur le premier élément */
    return liste;
}

llist ajouterAuMilieu(llist liste, int valeur)
{
    /* On crée un nouvel élément */
    element* nouvelElement = malloc(sizeof(element));

    /* On assigne la valeur au nouvel élément */
    nouvelElement->val = 17;
    if(liste == NULL)
    {
        /* Si la liste est videé il suffit de renvoyer l'élément créé */
        return nouvelElement;
    }
    else
    {
        /* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
        indique que le dernier élément de la liste est relié au nouvel élément */
        element* temp=liste;
        element *temp2=NULL;

        while(temp->nxt != NULL && temp->val!=valeur)
        {

            temp = temp->nxt;
            //printf("\n  est : %d\n",temp->val);
        }
        if(temp->val==valeur)
            {
                temp2=temp->nxt;
                temp->nxt=nouvelElement;
                nouvelElement->nxt=temp2;
                temp=nouvelElement;

                // printf("\n11111la long est : %d\n",longch(temp));
            }
        //printf("\n11111la long est : %d\n",longch(liste));
        // temp->nxt = nouvelElement;
        return liste;
    }


}


int longch(llist liste11)
{
    int i=0;
    element* liste = malloc(sizeof(element));
    liste=liste11;
    while(liste->nxt!=NULL)
    {
        i++;
        liste=liste->nxt;
    }
    return i;
}

llist ajouterEnFin(llist liste, int valeur)
{
    /* On crée un nouvel élément */
    element* nouvelElement = malloc(sizeof(element));

    /* On assigne la valeur au nouvel élément */
    nouvelElement->val = valeur;

    /* On ajoute en fin, donc aucun élément ne va suivre */
    nouvelElement->nxt = NULL;

    if(liste == NULL)
    {
        /* Si la liste est videé il suffit de renvoyer l'élément créé */
        return nouvelElement;
    }
    else
    {
        /* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
        indique que le dernier élément de la liste est relié au nouvel élément */
        element* temp=liste;
        while(temp->nxt != NULL)
        {
            temp = temp->nxt;
        }
        temp->nxt = nouvelElement;
        return liste;
    }
}


void afficherListe(llist liste)
{
    element *tmp = liste;
    /* Tant que l'on n'est pas au bout de la liste */
    while(tmp != NULL)
    {
        /* On affiche */
        printf("%d ", tmp->val);
        /* On avance d'une case */
        tmp = tmp->nxt;
    }
}

int main()
{
    llist ma_liste = NULL;
    int i;

    for(i=1;i<=10;i++)
    {
        ma_liste = ajouterEnTete(ma_liste, i);
        //printf("\n");
        ma_liste = ajouterEnFin(ma_liste, i);


    }

//printf("la long est : %d\n",longch(ma_liste));
    afficherListe(ma_liste);
    printf("\n");

    ma_liste =ajouterAuMilieu(ma_liste, 5);
    afficherListe(ajouterAuMilieu(ma_liste, 5));
//printf("la long est : %d\n",longch(ma_liste));
    //supprimerListe(ma_liste); // Libère les ressources, nous verrons cette fonction plus tard.

    return 0;
}
